// 版权归Go作者所有。版权所有。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

// go:build ignore 
// +build ignore 

package main

// 此程序生成palette.go。将其调用为
// go run gen.go-output palete.go 

import (
	"bytes"
	"flag"
	"fmt"
	"go/format"
	"io"
	"log"
	"os"
)

var filename = flag.String("output", "palette.go", "output file name")

func main() {
	flag.Parse()

	var buf bytes.Buffer

	fmt.Fprintln(&buf, `// /go作者版权所有。版权所有。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可在许可证文件中找到。`）
	fmt.Fprintln(&buf)
	fmt.Fprintln(&buf, "// go run gen.go-output PALETE.go生成的代码；不编辑。“）
	fmt.Fprintln(&buf)
	fmt.Fprintln(&buf, "package palette")
	fmt.Fprintln(&buf)
	fmt.Fprintln(&buf, `import "image/color"`)
	fmt.Fprintln(&buf)
	printPlan9(&buf)
	printWebSafe(&buf)

	data, err := format.Source(buf.Bytes())
	if err != nil {
		log.Fatal(err)
	}
	err = os.WriteFile(*filename, data, 0644)
	if err != nil {
		log.Fatal(err)
	}
}

func printPlan9(w io.Writer) {
	c, lines := [3]int{}, [256]string{}
	for r, i := 0, 0; r != 4; r++ {
		for v := 0; v != 4; v, i = v+1, i+16 {
			for g, j := 0, v-r; g != 4; g++ {
				for b := 0; b != 4; b, j = b+1, j+1 {
					den := r
					if g > den {
						den = g
					}
					if b > den {
						den = b
					}
					if den == 0 {
						c[0] = 0x11 * v
						c[1] = 0x11 * v
						c[2] = 0x11 * v
					} else {
						num := 17 * (4*den + v)
						c[0] = r * num / den
						c[1] = g * num / den
						c[2] = b * num / den
					}
					lines[i+(j&0x0f)] =
						fmt.Sprintf("\tcolor.RGBA{0x%02x, 0x%02x, 0x%02x, 0xff},", c[0], c[1], c[2])
				}
			}
		}
	}
	fmt.Fprintln(w, "// Plan9是一个256色调色板，将24位RGB空间“）
	fmt.Fprintln(w, "// 划分为4×4×4细分，每个子立方体中有4个阴影。与“）
	fmt.Fprintln(w, "// WebSafe相比，其想法是通过将“）
	fmt.Fprintln(w, "// 颜色立方体切割成更少的单元来降低颜色分辨率，并使用额外的空间来增加“）
	fmt.Fprintln(w, "// 强度分辨率。这将产生16个灰度（4个灰色子立方体，每个立方体中有“）
	fmt.Fprintln(w, "// 4个样本），每个主色和副色的13个色度（3“）
	fmt.Fprintln(w, "// 包含4个样本的子立方体加上黑色）和合理的颜色选择“）
	fmt.Fprintln(w, "// 覆盖颜色立方体的其余部分。优点是能更好地表现连续色调。）
	fmt.Fprintln(w, "// /”）
	fmt.Fprintln(w, "// /”）
	fmt.Fprintln(w, "// 此调色板用于Plan 9操作系统，如“）
	fmt.Fprintln(w, "// https:
	fmt.Fprintln(w, "var Plan9 = []color.Color{")
	for _, line := range lines {
		fmt.Fprintln(w, line)
	}
	fmt.Fprintln(w, "}")
	fmt.Fprintln(w)
}

func printWebSafe(w io.Writer) {
	lines := [6 * 6 * 6]string{}
	for r := 0; r < 6; r++ {
		for g := 0; g < 6; g++ {
			for b := 0; b < 6; b++ {
				lines[36*r+6*g+b] =
					fmt.Sprintf("\tcolor.RGBA{0x%02x, 0x%02x, 0x%02x, 0xff},", 0x33*r, 0x33*g, 0x33*b)
			}
		}
	}
	fmt.Fprintln(w, "// WebSafe是早期版本普及的216调色板）
	fmt.Fprintln(w, "// 的Netscape Navigator。它也被称为Netscape彩色立方体。”）
	fmt.Fprintln(w, "// “）
	fmt.Fprintln(w, "// /请参阅https:
	fmt.Fprintln(w, "var WebSafe = []color.Color{")
	for _, line := range lines {
		fmt.Fprintln(w, line)
	}
	fmt.Fprintln(w, "}")
	fmt.Fprintln(w)
}
